package visiopuce.action;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.eclipse.jface.action.Action;

import visiopuce.HibernateUtil;
import visiopuce.ICommandIds;
import visiopuce.objets.Biomedecine;
import visiopuce.objets.Champ;
import visiopuce.objets.Personne;
import visiopuce.objets.Prelevement;
import visiopuce.objets.Utilisateur;
import visiopuce.service.PersonneServiceImpl;
import visiopuce.service.PrelevementServiceImpl;
import visiopuce.service.ReferentielService;
import visiopuce.service.ReferentielServiceImpl;
import visiopuce.service.UtilisateurService;
import visiopuce.service.UtilisateurServiceImpl;

public class ParserConservationAction extends Action {

	ReferentielService referentielService = ReferentielServiceImpl.getInstance();
	UtilisateurService utilisateurService = UtilisateurServiceImpl.getInstance();
	// SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
	SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
	private String ligne;

	public ParserConservationAction(String text) {
		super(text);
		// The id is used to refer to the action in a menu or toolbar
		setId(ICommandIds.CMD_PARSER_CONSERVATION);
		// Associate the action with a pre-defined command, to allow key
		// bindings.
		setActionDefinitionId(ICommandIds.CMD_PARSER_CONSERVATION);
		setText("Parser le conservation sang");
		setToolTipText("Paser conservation sang");
		setImageDescriptor(visiopuce.Activator.getImageDescriptor("/icons/switch-user.png"));
	}

	public void run() {
		SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
		int u = 1000;
		InputStream ips;
		try {
			// ips = new
			//ips = new FileInputStream("H:/Liste conservation sang total - 2013.12.06.csv");
			ips = new FileInputStream("C:/Temp/Liste conservation sang total - 2013.12.06.csv");

			InputStreamReader ipsr = new InputStreamReader(ips, "utf8");
			BufferedReader br = new BufferedReader(ipsr);

			Biomedecine bm = ReferentielServiceImpl.getInstance().getTypeIndicationById(26);
			while ((ligne = br.readLine()) != null) {

				String nom = "";
				String prenom = "";
				Date dateNaissance = null;
				Date[] dateSortie = null;
				String[] commentaire = null;
				String nomPresc = null;
				String numeroDossier = "";
				String numeroBoite = "";
				String[] tabCommentaire = null;
				Date datePrel = null;
				int nbEDTA = 0;
				int nbSec = 0;
				int nbPax = 0;
				int nbSerum = 0;
				int nbHep = 0;

				String[] tableau = ligne.split(";");
				if (tableau.length > 3) {
					nom = tableau[0].trim().toUpperCase();
					prenom = tableau[1].trim().toUpperCase();
					try {
						dateNaissance = formatter.parse(tableau[2].trim());
					} catch (ParseException e) {
						if (tableau[2].trim().length() > 0) {
							System.out.println("erreur de format de date de naissance: " + tableau[2] + " ligne : " + ligne);
						}
					}

					if (tableau.length >= 4) {
						String[] tab = tableau[3].trim().split(" ");
						if (tab.length > 1) {
							nomPresc = tab[1].trim();
						} else {
							if (tableau[3].trim().length() > 0) {
								System.out.println("erreur de nom du médecin: " + tableau[3] + " ligne : " + ligne);
							}
						}
					}
					if (tableau.length >= 5) {
						try {
							datePrel = formatter.parse(tableau[4].trim());
						} catch (ParseException e) {
							if (tableau[4].trim().length() > 0) {
								System.out.println("erreur de format de date de prélèvement: " + tableau[4] + " ligne : " + ligne);
							}
						}
					}

					if (tableau.length >= 6) {
						numeroDossier = tableau[5].trim();
					}

					if (tableau.length >= 7) {
						numeroBoite = tableau[6].trim();
					}

					if (tableau.length >= 8) {
						String tube = tableau[7].trim();
						if (tube.length() == 1) {
							nbEDTA += Integer.parseInt(tube);
						} else {
							String[] tab1 = tube.split("\\+");
							for (String string : tab1) {
								if (string.contains("EDTA")) {
									nbEDTA += Integer.parseInt(string.trim().substring(0, 1));
								} else if (string.contains("sec")) {
									nbSec += Integer.parseInt(string.trim().substring(0, 1));
								} else if (string.contains("Pax")) {
									nbPax += Integer.parseInt(string.trim().substring(0, 1));
								} else if (string.contains("serum")) {
									nbSerum += Integer.parseInt(string.trim().substring(0, 1));
								} else if (string.contains("héparine")) {
									nbHep += Integer.parseInt(string.trim().substring(0, 1));
								} else if (string.length() == 1) {
									nbEDTA += Integer.parseInt(string.trim().substring(0, 1));
								} else {
									if (tableau[7].trim().length() > 0) {
										System.out.println("erreur de format du type de tube: " + tableau[7] + " ligne : " + ligne);
									}
								}
							}

						}
					}

					if (tableau.length >= 9 && !tableau[8].trim().isEmpty()) {
						String[] tabledateSortie = tableau[8].trim().split("\\s");
						int i = 0;
						int j = 0;
						dateSortie = new Date[tabledateSortie.length];
						for (String dateSor : tabledateSortie) {
							try {
								if (dateSor.trim().length() > 0) {
									dateSortie[j] = formatter.parse(dateSor.trim());
									j++;
								}
							} catch (ParseException e) {
								if (tableau[4].trim().length() > 0) {
									System.out.println("erreur de format de date de sortie: " + tableau[4] + " ligne : " + ligne);
								}
							}
							i++;
						}

					}
					if (tableau.length >= 10 && !tableau[9].trim().isEmpty()) {
						if (tableau[9].contains("1 tube")) {
							tabCommentaire = tableau[9].trim().split("1 tube");
							int i = 0;
							commentaire = new String[tabCommentaire.length];
							for (String comm : tabCommentaire) {
								commentaire[i] = comm.trim();
								i++;
							}
						} else {
							commentaire = new String[1];
							commentaire[0] = tableau[9].trim();
						}

					} else {
						commentaire = new String[1];
						commentaire[0] = "";
					}

//					
					Prelevement prel = null;
					Personne p = null;
					if (!numeroDossier.isEmpty()) {
						prel = PrelevementServiceImpl.getInstance().getPrelevementByNumero(numeroDossier);
						
					} else {
						p = PersonneServiceImpl.getInstance().getPersonneByNomPrenomDateNaissance(nom, prenom, dateNaissance);
						if (p != null) {
							List<Prelevement> prels = PrelevementServiceImpl.getInstance().findAllByidPersonne(p.getIdPersonne());
							for (Prelevement prelev : prels) {
								if (prelev.getNumeroPrelevement().contains("cong")) {
									prel = prelev;
									break;
								}
							}
						}
					}
					if (prel == null) {
						// /début du remplissage des objets :
						numeroDossier = "cong" + u;
						u++;
	
					
						prel = new Prelevement();
						prel.setIdPrelevement(0);
						prel.setNumeroPrelevement(numeroDossier);
						p = PersonneServiceImpl.getInstance().getPersonneByNomPrenomDateNaissance(nom, prenom, dateNaissance);
					} else {
						prel.setIndication(ReferentielServiceImpl.getInstance().getTypeIndicationById(26));
						p = PersonneServiceImpl.getInstance().getPersonneById(prel.getPersonne().getIdPersonne());
					}
					if (p == null) {
						p = new Personne();
						p.setIdPersonne(0);
						p.setNom(nom);
						p.setType("NA");
						p.setPrenom(prenom);
						p.setDateNaissance(dateNaissance);
						p.setSexe("NA");
					}

					HibernateUtil.beginTransaction();
					HibernateUtil.getSession().saveOrUpdate(p);
					HibernateUtil.commitTransaction();

					if (prel.getDatePrelevement() == null) {
						prel.setDatePrelevement(datePrel);
					}

					if (prel.getPersonne() == null && p != null) {
						prel.setPersonne(p);
					}
					prel.setIndication(bm);
					if (prel.getSecteur() == null || prel.getSecteur().getIdSecteur() == 0) {
						prel.setSecteur(ReferentielServiceImpl.getInstance().getSecteurByid("" + 5));
					}
					if (prel.getTypePrelevement() == null || prel.getTypePrelevement().getLibelle().equals("inconnue")) {
						if (commentaire[0].contains("sang fœtal") || commentaire[0].contains("Sang fœtal")) {
							prel.setTypePrelevement(ReferentielServiceImpl.getInstance().getTypePrelevementByLibelle("Sang foetal"));
						} else if (commentaire[0].contains("sang de cordon") || commentaire[0].contains("Sang de cordon") || commentaire[0].contains("sang cordon") || commentaire[0].contains("Sang du cordon")) {
							prel.setTypePrelevement(ReferentielServiceImpl.getInstance().getTypePrelevementByLibelle("Sang de cordon"));
						} else {
							prel.setTypePrelevement(ReferentielServiceImpl.getInstance().getTypePrelevementByLibelle("Sang"));
						}
					}
					if (prel.getPrescripteur() == null && nomPresc != null) {
						Utilisateur prescipteur = UtilisateurServiceImpl.getInstance().getUtilisateurByNom(nomPresc);
						if (prescipteur != null) {
							prel.setPrescripteur(prescipteur);
						}
					}
					prel.setRecherche(false);
					if (tableau.length > 10 && !tableau[9].trim().isEmpty()) {
						prel.setInfoIndication(tableau[9].trim());
					}
					if (prel.getNumSejour() == null) {
						prel.setNumSejour("0");
					}
					HibernateUtil.beginTransaction();
					HibernateUtil.getSession().saveOrUpdate(prel);
					HibernateUtil.commitTransaction();

					// Date dateSortie = null;
					// String commentaire = "";
					// String nomPresc = null;
					//
					// String numeroBoite = "";

					Champ cnbSang = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("nbSang", "Prel-" + prel.getIdPrelevement());
					if (cnbSang == null) {
						cnbSang = new Champ();
						cnbSang.setIdObjet("Prel-" + prel.getIdPrelevement());
						cnbSang.setType("nbSang");
					}
					int nbTube = nbSec + nbSerum + nbEDTA + nbHep + nbPax;
					cnbSang.setValeur("" + nbTube);
					HibernateUtil.beginTransaction();
					HibernateUtil.getSession().saveOrUpdate(cnbSang);
					HibernateUtil.commitTransaction();
					int nb = 0;
					for (int i = 0; i < nbSec; i++) {
						Champ crTube = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("comboTube" + "-" + nb, "Prel-" + prel.getIdPrelevement());
						if (crTube == null) {
							crTube = new Champ();

							crTube.setIdObjet("Prel-" + prel.getIdPrelevement());
							crTube.setType("comboTube" + "-" + i);
						}

						crTube.setValeur("Tube sec");

						HibernateUtil.beginTransaction();
						HibernateUtil.getSession().saveOrUpdate(crTube);
						HibernateUtil.commitTransaction();
						nb++;
					}

					for (int i = 0; i < nbSerum; i++) {
						Champ crTube = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("comboTube" + "-" + nb, "Prel-" + prel.getIdPrelevement());
						if (crTube == null) {
							crTube = new Champ();

							crTube.setIdObjet("Prel-" + prel.getIdPrelevement());
							crTube.setType("comboTube" + "-" + nb);
						}

						crTube.setValeur("sérum");

						HibernateUtil.beginTransaction();
						HibernateUtil.getSession().saveOrUpdate(crTube);
						HibernateUtil.commitTransaction();
						nb++;
					}

					for (int i = 0; i < nbEDTA; i++) {
						Champ crTube = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("comboTube" + "-" + nb, "Prel-" + prel.getIdPrelevement());
						if (crTube == null) {
							crTube = new Champ();

							crTube.setIdObjet("Prel-" + prel.getIdPrelevement());
							crTube.setType("comboTube" + "-" + nb);
						}

						crTube.setValeur("EDTA");

						HibernateUtil.beginTransaction();
						HibernateUtil.getSession().saveOrUpdate(crTube);
						HibernateUtil.commitTransaction();
						nb++;
					}

					for (int i = 0; i < nbHep; i++) {
						Champ crTube = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("comboTube" + "-" + nb, "Prel-" + prel.getIdPrelevement());
						if (crTube == null) {
							crTube = new Champ();

							crTube.setIdObjet("Prel-" + prel.getIdPrelevement());
							crTube.setType("comboTube" + "-" + nb);
						}

						crTube.setValeur("hépariné");

						HibernateUtil.beginTransaction();
						HibernateUtil.getSession().saveOrUpdate(crTube);
						HibernateUtil.commitTransaction();
						nb++;
					}

					for (int i = 0; i < nbPax; i++) {
						Champ crTube = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("comboTube" + "-" + nb, "Prel-" + prel.getIdPrelevement());
						if (crTube == null) {
							crTube = new Champ();

							crTube.setIdObjet("Prel-" + prel.getIdPrelevement());
							crTube.setType("comboTube" + "-" + nb);
						}

						crTube.setValeur("Paxgene");

						HibernateUtil.beginTransaction();
						HibernateUtil.getSession().saveOrUpdate(crTube);
						HibernateUtil.commitTransaction();
						nb++;
					}

					if (numeroBoite != null && !numeroBoite.isEmpty()) {
						for (int i = 0; i < nbTube; i++) {
							Champ crSang = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tRangementSang" + "-" + i, "Prel-" + prel.getIdPrelevement());
							if (crSang == null) {
								crSang = new Champ();

								crSang.setIdObjet("Prel-" + prel.getIdPrelevement());
								crSang.setType("tRangementSang" + "-" + i);
							}
							crSang.setValeur(numeroBoite);
							HibernateUtil.beginTransaction();
							HibernateUtil.getSession().saveOrUpdate(crSang);
							HibernateUtil.commitTransaction();

							if (dateSortie != null && dateSortie.length > i) {

								Champ cEnvoye = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("btnCheckEnvoye" + "-" + i, "Prel-" + prel.getIdPrelevement());
								if (cEnvoye == null) {
									cEnvoye = new Champ();

									cEnvoye.setIdObjet("Prel-" + prel.getIdPrelevement());
									cEnvoye.setType("btnCheckEnvoye" + "-" + i);
								}
								cEnvoye.setValeur(Boolean.TRUE.toString());
								HibernateUtil.beginTransaction();
								HibernateUtil.getSession().saveOrUpdate(cEnvoye);
								HibernateUtil.commitTransaction();
								String date = "";
								if (dateSortie[i] != null) {
									date = "(le " + formatter.format(dateSortie[i]) + ")";
								}
								String comm = "";
								if (tabCommentaire != null && i + 1 < tabCommentaire.length) {

									comm = comm + tabCommentaire[i + 1] + date;
								}
								if (comm != null) {
									Champ cCommentaire = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tCommentaireEnvoi" + "-" + i, "Prel-" + prel.getIdPrelevement());
									if (cCommentaire == null) {
										cCommentaire = new Champ();

										cCommentaire.setIdObjet("Prel-" + prel.getIdPrelevement());
										cCommentaire.setType("tCommentaireEnvoi" + "-" + i);
									}
									cCommentaire.setValeur(comm);
									HibernateUtil.beginTransaction();
									HibernateUtil.getSession().saveOrUpdate(cCommentaire);
									HibernateUtil.commitTransaction();

								}

							}
						}
					}

				}

			}
		} catch (FileNotFoundException e) {
			System.out.println(ligne);
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println(ligne);
			e.printStackTrace();
		} catch (NumberFormatException e) {
			System.out.println(ligne);
			e.printStackTrace();
		}
	}
}
